package com.ingenio.servlet;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ingenio.business.EstadoProducto;
import com.ingenio.business.Marca;
import com.ingenio.business.PrecioProducto;
import com.ingenio.business.Producto;
import com.ingenio.business.SubRubro;
import com.ingenio.business.UMProducto;
import com.ingenio.business.UnidadMedida;
import com.ingenio.dao.EstadoProductoAdapter;
import com.ingenio.dao.MarcaAdapter;
import com.ingenio.dao.ProductoAdapter;
import com.ingenio.dao.SubRubroAdapter;
import com.ingenio.dao.UnidadMedidaAdapter;

/**
 * Servlet implementation class ConceptoMovimientoServlet
 */
@WebServlet("/ABMProducto")
public class ABMProductoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ABMProductoServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String descripcion = "", idProducto=null, caracteristicas=null, descUMProd=null;
		Integer idUMStock=null, idEstado=null, idSubrubro=null, idMarca=null, idUMProd=null;
		Double coefUMConv = null, precioProd=null;
		Date fechaPrecio = null;
		boolean defUMProd=false, existenPrecios=false;
		PrecioProducto pp = null;
		ProductoAdapter pa = new ProductoAdapter();
		EstadoProductoAdapter epa = new EstadoProductoAdapter();
		EstadoProducto ep = null;
		MarcaAdapter ma = new MarcaAdapter();
		Marca m = null;
		UnidadMedidaAdapter uma = new UnidadMedidaAdapter();
		UnidadMedida um = null, umProd=null, umProdConv=null;
		SubRubroAdapter sra = new SubRubroAdapter();
		SubRubro sr = null;
		Producto p = null;
		UMProducto ump = null;
		DateFormat df = new SimpleDateFormat("yyyy-mm-dd");
		String arrayFechaPrecio[]=null, arrayUMProd[]=null, arrayPrecioProducto[]=null, arrayMarcaPreciosNuevo[]=null;
		if("delete".equals(request.getParameter("type"))){
			try {
				idProducto = request.getParameter("id");
				p = pa.devolverProducto(idProducto);
				pa.eliminarProducto(p);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}else if("edit".equals(request.getParameter("type"))){
			if(request.getParameter("descripcion_producto") != null && request.getParameter("id_producto_hidden") != null
					&& request.getParameter("id_umStock_hidden") != null && request.getParameter("id_marca") != null
					&& request.getParameter("id_subrubro") != null && request.getParameter("caracteristicas_producto") != null
					&& request.getParameter("id_estado") != null){
				idProducto = request.getParameter("id_producto_hidden");
				descripcion = request.getParameter("descripcion_producto");
				caracteristicas = request.getParameter("caracteristicas_producto");
				idMarca = Integer.parseInt(request.getParameter("id_marca"));
				idSubrubro = Integer.parseInt(request.getParameter("id_subrubro"));
//				idUMStock = Integer.parseInt(request.getParameter("id_umStock")); // NO SE PUEDE MODIFICAR
				idEstado = Integer.parseInt(request.getParameter("id_estado"));
				
				try {
					// recupero array de valores de UM Producto
					String arrayIdUMProd[] = request.getParameterValues("id_umProducto");
					String arrayDescUMProd[] = request.getParameterValues("descripcion_umProducto");
					String arrayUMConvUMProd[] = request.getParameterValues("id_umProdConv");
					String arrayCoefUMProd[] = request.getParameterValues("coefConv_umProducto");
					Integer idDefUMProd = Integer.parseInt(request.getParameter("default_umProducto"));
					
					// recupero array de valores de Precios
					if (request.getParameterValues("FechaPrecio")!=null && request.getParameterValues("id_umPrecioProducto")!=null
							&& request.getParameterValues("PrecioProducto")!=null && request.getParameterValues("marcaNuevosPrecios")!=null){
						arrayFechaPrecio = request.getParameterValues("FechaPrecio");
						arrayUMProd = request.getParameterValues("id_umPrecioProducto");
						arrayPrecioProducto = request.getParameterValues("PrecioProducto");
						arrayMarcaPreciosNuevo = request.getParameterValues("marcaNuevosPrecios");
						existenPrecios = true;
					}else{
						existenPrecios = false;
					}
					
					p = pa.devolverProducto(idProducto);
					p.setDescProducto(descripcion);
					p.setCaracteristicasProd(caracteristicas);
					ep = epa.devolverEstadoProducto(idEstado);
					p.setEstadoProducto(ep);
					m = ma.devolverMarca(idMarca);
					p.setMarca(m);
					sr = sra.devolverSubRubro(idSubrubro);
					p.setSubRubro(sr);
					
					// Creo Lista de UM Producto
					List<UMProducto> unidadesMedidaProd = new ArrayList<UMProducto>();
					for(int i=0;i<arrayIdUMProd.length;i++){
						umProd = (arrayIdUMProd[i]!="-1")?uma.devolverUnidadMedida(Integer.parseInt(arrayIdUMProd[i])):null;
						umProdConv = (arrayUMConvUMProd[i]!="-1")?uma.devolverUnidadMedida(Integer.parseInt(arrayUMConvUMProd[i])):null;
						descUMProd = (arrayDescUMProd[i]!="")?arrayDescUMProd[i]:null;
						coefUMConv = (arrayCoefUMProd[i]!="")?Double.parseDouble(arrayCoefUMProd[i]):null;
						defUMProd = (Integer.parseInt(arrayIdUMProd[i])!=idDefUMProd)?true:false;
						ump = new UMProducto(p, umProd, umProdConv, coefUMConv, descUMProd, defUMProd, true);
						unidadesMedidaProd.add(ump);
					}
					
					List<UMProducto> umsProd = new  ArrayList<UMProducto>();
					List<UMProducto> umsProdNuevas = new  ArrayList<UMProducto>();
					List<UMProducto> umsViejas = p.getUmsProducto();
					for(UMProducto umpVieja:umsViejas){
						if(umpVieja.inUMProducto(unidadesMedidaProd)){
							for(UMProducto umpNueva:unidadesMedidaProd){
								if(umpVieja.getUnidadMedida().getIdUnidadMedida().equals(umpNueva.getUnidadMedida().getIdUnidadMedida())){
									umsProd.add(umpNueva);  // Actualizo la UM Vieja con la Nueva
									break;
								}else{
									if(!umpNueva.inUMProducto(umsViejas)){
										umsProdNuevas.add(umpNueva); // Guardo las nuevas UM
									}
								}
							}
						}else{
							umpVieja.setUpmHabilitado(false); // Marco como Eliminado
							umsProd.add(umpVieja);
						}
					}
					p.setUmsProducto(umsProd);
					
					if(existenPrecios){// Creo Lista de Precios Producto
						List<PrecioProducto> preciosProd = new ArrayList<PrecioProducto>();
						for(int i=0;i<arrayPrecioProducto.length;i++){
							if (arrayMarcaPreciosNuevo[i]!="-1"){ // Si el Precio es Nuevo
								fechaPrecio = (arrayFechaPrecio[i]!="")?df.parse(arrayFechaPrecio[i]):null;
								idUMProd = (arrayUMProd[i]!="-1")?Integer.parseInt(arrayUMProd[i]):null;
								for(UMProducto umProducto:unidadesMedidaProd){
									if(umProducto.getUnidadMedida().getIdUnidadMedida().equals(idUMProd)){
										ump = umProducto;
										break;
									}
								}
								precioProd = (arrayPrecioProducto[i]!="")?Double.parseDouble(arrayPrecioProducto[i]):null;
								pp = new PrecioProducto(p, fechaPrecio, precioProd, ump);
								preciosProd.add(pp);
							}
						}
						// seteo lista de Precios Producto
						p.setPrecios(preciosProd);
					}	
					
					pa.modificarProducto(p, umsProdNuevas);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}else if("add".equals(request.getParameter("type"))){
			if(request.getParameter("descripcion_producto") != null && request.getParameter("id_producto") != null
					&& request.getParameter("id_umStock") != null && request.getParameter("id_marca") != null
					&& request.getParameter("id_subrubro") != null && request.getParameter("caracteristicas_producto") != null
					&& request.getParameter("id_estado_hidden") != null){
				idProducto = request.getParameter("id_producto");
				descripcion = request.getParameter("descripcion_producto");
				caracteristicas = request.getParameter("caracteristicas_producto");
				idMarca = Integer.parseInt(request.getParameter("id_marca"));
				idSubrubro = Integer.parseInt(request.getParameter("id_subrubro"));
				idUMStock = Integer.parseInt(request.getParameter("id_umStock"));
				idEstado = Integer.parseInt(request.getParameter("id_estado_hidden"));
				
				// recupero array de valores de UM Producto
				String arrayIdUMProd[] = request.getParameterValues("id_umProducto");
				String arrayDescUMProd[] = request.getParameterValues("descripcion_umProducto");
				String arrayUMConvUMProd[] = request.getParameterValues("id_umProdConv");
				String arrayCoefUMProd[] = request.getParameterValues("coefConv_umProducto");
				Integer idDefUMProd = Integer.parseInt(request.getParameter("default_umProducto"));
				
				// recupero array de valores de Precios
				if (request.getParameterValues("FechaPrecio")!=null && request.getParameterValues("id_umPrecioProducto")!=null
						&& request.getParameterValues("PrecioProducto")!=null){
					arrayFechaPrecio = request.getParameterValues("FechaPrecio");
					arrayUMProd = request.getParameterValues("id_umPrecioProducto");
					arrayPrecioProducto = request.getParameterValues("PrecioProducto");
					existenPrecios = true;
				}else{
					existenPrecios = false;
				}
				
				try {
					ep = epa.devolverEstadoProducto(idEstado);
					um = uma.devolverUnidadMedida(idUMStock);
					m = ma.devolverMarca(idMarca);
					sr = sra.devolverSubRubro(idSubrubro);
					
					// Creo Lista de UM Producto
					List<UMProducto> unidadesMedidaProd = new ArrayList<UMProducto>();
					for(int i=0;i<arrayIdUMProd.length;i++){
						umProd = (arrayIdUMProd[i]!="-1")?uma.devolverUnidadMedida(Integer.parseInt(arrayIdUMProd[i])):null;
						umProdConv = (arrayUMConvUMProd[i]!="-1")?uma.devolverUnidadMedida(Integer.parseInt(arrayUMConvUMProd[i])):null;
						descUMProd = (arrayDescUMProd[i]!="")?arrayDescUMProd[i]:null;
						coefUMConv = (arrayCoefUMProd[i]!="")?Double.parseDouble(arrayCoefUMProd[i]):null;
						defUMProd = (Integer.parseInt(arrayIdUMProd[i])!=idDefUMProd)?true:false;
						ump = new UMProducto(p, umProd, umProdConv, coefUMConv, descUMProd, defUMProd, true);
						unidadesMedidaProd.add(ump);
					}
					
					// creo Producto
					p = new Producto(idProducto,descripcion,ep,um,unidadesMedidaProd,m,sr,caracteristicas,true);
					
					if(arrayPrecioProducto.length > 0){// Creo Lista de Precios Producto
						List<PrecioProducto> preciosProd = new ArrayList<PrecioProducto>();
						for(int i=0;i<arrayPrecioProducto.length;i++){
							fechaPrecio = (arrayFechaPrecio[i]!="")?df.parse(arrayFechaPrecio[i]):null;
							idUMProd = (arrayUMProd[i]!="-1")?Integer.parseInt(arrayUMProd[i]):null;
							for(UMProducto umProducto:unidadesMedidaProd){
								if(umProducto.getUnidadMedida().getIdUnidadMedida().equals(idUMProd)){
									ump = umProducto;
									break;
								}
							}
							precioProd = (arrayPrecioProducto[i]!="")?Double.parseDouble(arrayPrecioProducto[i]):null;
							pp = new PrecioProducto(p, fechaPrecio, precioProd, ump);
							preciosProd.add(pp);
						}
						// seteo lista de Precios Producto
						p.setPrecios(preciosProd);
					}
					
					pa.agregarProducto(p);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		response.sendRedirect("productos/listado_producto.jsp");
	}
}


